#ifndef PLAYFAB_<%- api.name.toUpperCase() %>API_H_
#define PLAYFAB_<%- api.name.toUpperCase() %>API_H_

#include "IHttpRequester.h"
#include "PlayFabError.h"
#include "PlayFab<%- api.name %>DataModels.h"
#include <string>

namespace PlayFab
{
    class PlayFab<%- api.name %>API
    {
    public:
        template<typename ResType> using ProcessApiCallback = std::function<void(const ResType& result, void* userData)>;
<% if (hasClientOptions) { %>
        // Public, Client-Specific
        static void MultiStepClientLogin(bool needsAttribution);
        static bool IsClientLoggedIn();
<% } %>
        // ------------ Generated API calls
<% for(var i in api.calls) { var apiCall = api.calls[i]; if (hasRequest(apiCall, api)) { %><%- getDeprecationAttribute("        ", apiCall)
%>        static void <%- apiCall.name %>(<%- api.name %>Models::<%- apiCall.request %>& request, ProcessApiCallback<<%- api.name %>Models::<%- apiCall.result%>> callback, ErrorCallback errorCallback = nullptr, void* userData = nullptr);
<% } else { %><%- getDeprecationAttribute("        ", apiCall)
%>        static void <%- apiCall.name %>(ProcessApiCallback<<%- api.name %>Models::<%- apiCall.result%>> callback, ErrorCallback errorCallback = nullptr, void* userData = nullptr);
<% } } %>
    private:
        // ------------ Private constructor, to enforce all-static class
        PlayFab<%- api.name %>API();

        // ------------ Generated result handlers
<% for(var i in api.calls) { var apiCall = api.calls[i];
%>        static void On<%- apiCall.name %>Result(int httpStatus, HttpRequest* request, void* userData);
<% } %>    };
};
#endif
